package ma.co.ba.BusinessApplications.presentation.controllers.products;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ma.co.ba.BusinessApplications.business.commons.CommonBusiness;
import ma.co.ba.BusinessApplications.business.products.ProduitBusiness;
import ma.co.ba.BusinessApplications.business.utilisateurs.UtilisateurBusiness;
import ma.co.ba.BusinessApplications.model.FamilleDeProduit;
import ma.co.ba.BusinessApplications.model.Produit;
import ma.co.ba.BusinessApplications.model.Utilisateur;
import ma.co.ba.BusinessApplications.presentation.components.FamilleDeProduitEditor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

@Controller
@RequestMapping("/products")
public class ProduitController {
	@Autowired
	UtilisateurBusiness utilisateurBusiness;
	@Autowired
	ProduitBusiness produitBusiness;
	@Autowired
	FamilleDeProduitEditor familleDeProduitEditor;
	@Autowired
	CommonBusiness commonBusiness;

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		binder.registerCustomEditor(FamilleDeProduit.class,
				this.familleDeProduitEditor);
	}

	@RequestMapping(method = RequestMethod.GET)
	public String productsPage(ModelMap model) {

		return "products";
	}

	@RequestMapping(method = RequestMethod.POST)
	public String saveProductFamily(
			@ModelAttribute("newProductFamily") FamilleDeProduit newProductFamily,
			BindingResult result, SessionStatus status) {

		System.out.println("*****************saveFamille********************");
		System.out.println(newProductFamily.getProductFamilyName());
		produitBusiness.saveFamilleProduit(newProductFamily);

		return "redirect:products";
	}

	@RequestMapping(value = "/deleteFP", method = RequestMethod.GET)
	public String deleteFP(ModelMap model,
			@RequestParam("id") int familyProductId) {

		FamilleDeProduit familleDeProduit = produitBusiness
				.getFamilleProduitById(familyProductId);
		commonBusiness.deleteEntity(familleDeProduit);

		// // return view
		return "redirect:/products";
	}

	@RequestMapping(value = "/productsList", method = RequestMethod.GET)
	public String productsPerFamilyPage(ModelMap model,
			@RequestParam("id") int familyProductId) {

		FamilleDeProduit famille = produitBusiness
				.getFamilleProduitById(familyProductId);

		List<Produit> productsPerFamilyList = produitBusiness
				.getAllProduitsParIdFamille(familyProductId);

		model.addAttribute("productsPerFamilyList", productsPerFamilyList);

		model.addAttribute("famille", famille);

		System.out.println("------- Liste de Produits par Famille -------");
		// // return view
		return "productsList";
	}

	@RequestMapping(value = "/productsList", method = RequestMethod.POST)
	public String addProductInListPage(ModelMap model,
			@ModelAttribute("id") int familyProductId,
			@ModelAttribute("newProduct") Produit newProduct) {

		FamilleDeProduit familleDeProduit = produitBusiness
				.getFamilleProduitById(familyProductId);
		newProduct.setFamilleDeProduit(familleDeProduit);
		commonBusiness.saveEntity(newProduct);

		return "redirect:productsList";
	}

	@RequestMapping(value = "/update", method = RequestMethod.GET)
	public String getUpdateFamilyProductModal(ModelMap model,
			@ModelAttribute("id") int familyProductId) {

		System.out.println("update family product !");
		FamilleDeProduit familleP = produitBusiness
				.getFamilleProduitById(familyProductId);
		System.out.println("update family product !");
		model.addAttribute("familleP", familleP);

		return "editFamily";
	}

	@RequestMapping(value = "/update", method = RequestMethod.POST)
	public String updateFamilyProductModal(ModelMap model,
			@ModelAttribute("familleP") FamilleDeProduit familleP) {

		commonBusiness.updateEntity(familleP);

		return "redirect:/products";
	}

	@RequestMapping(value = "/productsList/update", method = RequestMethod.GET)
	public String getUpdateProductModal(ModelMap model,
			@ModelAttribute("id") int productId) {

		Produit upProduct = produitBusiness.getProduitById(productId);
		model.addAttribute("id", upProduct.getFamilleDeProduit().getId());
		model.addAttribute("upProduct", upProduct);
		System.out.println("Edit Product Modal!!");
		return "editProduct";
	}

	@RequestMapping(value = "/productsList/update", method = RequestMethod.POST)
	public String updateProductModal(ModelMap model,
			@ModelAttribute("upProduct") Produit upProduct,
			@RequestParam("id") int id) {

		
		Produit prd = produitBusiness.getProduitById(upProduct.getId());
//		id = prd.getFamilleDeProduit().getId();
		prd.setMatriculeProduit(upProduct.getMatriculeProduit());
		prd.setProductName(upProduct.getProductName());
		
		commonBusiness.updateEntity(upProduct);
		return "redirect:/products/productsList";
	}

	@RequestMapping(value = "/deleteP", method = RequestMethod.GET)
	public String deleteP(ModelMap model, @RequestParam("idP") int productId) {

		Produit produit = produitBusiness.getProduitById(productId);
		int idFamille = produit.getFamilleDeProduit().getId();
		model.addAttribute("id", idFamille);
		// model.addAttribute("id", produit.getFamilleDeProduit().getId());
		commonBusiness.deleteEntity(produit);

		// // return view
		return "redirect:productsList";
	}

	@ModelAttribute("productsList")
	List<Produit> getProductsList() {
		return produitBusiness.getAllProduits();
	}

	@ModelAttribute("productFamilyList")
	List<FamilleDeProduit> getProductFamilyList() {
		return produitBusiness.getAllFamilleProduits();
	}

	@ModelAttribute("newProductFamily")
	FamilleDeProduit getNewProductFamily() {
		return new FamilleDeProduit();
	}

	@ModelAttribute("newProduct")
	Produit getNewProduct() {
		return new Produit();
	}

	@ModelAttribute("familyProductFormList")
	public Map<String, String> getGroupeList() {
		List<FamilleDeProduit> familleDeProduits = null;
		familleDeProduits = produitBusiness.getAllFamilleProduits();

		Map<String, String> familyProductFormList = new HashMap<String, String>();
		if (familleDeProduits != null) {
			for (FamilleDeProduit familleDeProduit : familleDeProduits) {
				familyProductFormList.put(familleDeProduit.getId() + "",
						familleDeProduit.getProductFamilyName());
			}
		}
		return familyProductFormList;
	}

	@ModelAttribute("utilisateurs")
	public List<Utilisateur> getUtilisateurs() {
		List<Utilisateur> utilisateurs = utilisateurBusiness
				.getAllConsultants();
		return utilisateurs;
	}
}